/**
 * 
 */
package com.rrd.hive.udf.excel;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;


/**
 * EXCEL PMT函数
 * 实现PMT函数，需要传入4个或5个参数：
 * 参数1rate：年利率 年利率除以12就是月利率
 * 参数2 nper：为总投资期，即该项投资的付款期总数。
 * 参数3 pv：贷款金额,现值，或一系列未来付款的当前值的累积和，也称为本金
 * 参数4 fv： 为未来值，或在最后一次付款后希望得到的现金余额，如果省略 fv，则假设其值为零，也就是一笔贷款的未来值为零
 * 参数5 type： 数字 0 或 1，用以指定各期的付款时间是在期初还是期末
 * 参考：http://poi.apache.org/apidocs/dev/org/apache/poi/ss/formula/functions/Finance.html#pmt-double-int-double-
 * @author liubaoxin
 *
 */
public class ExcelPMTUDF extends UDF { 
     public Double evaluate(double r, int nper, double pv, double fv) {
    	 return evaluate(r,nper,pv,fv,1);
	 }
     public Double evaluate(double r, int nper, double pv, double fv, int type) {
//    	 double pmt = r / (Math.pow(1 + r, nper) - 1)
//    	            * -(pv * Math.pow(1 + r, nper) + fv);
//    	 return pmt;
    	  return -r * (pv * Math.pow(1 + r, nper) + fv) / ((1 + r*type) * (Math.pow(1 + r, nper) - 1));
	 }
	 
	
	 public static void main(String[] args) {
		 ExcelPMTUDF pmt = new ExcelPMTUDF();
		  System.out.println(pmt.evaluate(0.07/12, 30*12, 165000d, 0, 0));
 	}
}
